package main

import "fmt"

func producer(ch chan<- int) {
	for i := 1; i < 11; i++ {
		ch <- i
		fmt.Println("插入值", i)
	}
	// 写完后关闭通道
	// 如果不close掉channel是会发生死锁的，原因是 当for循环读完channel的10个值之后会继续尝试读取下一个，而由于channel为空又没关闭，会一直阻塞形成死锁
	close(ch)
}

func consumer(ch <-chan int, exitChan chan<- bool) {
	for i := 1; i < 11; i++ {
		fmt.Println("取出值", <-ch)
	}
	// 读取完后关闭通道写入true
	exitChan <- true
	close(exitChan)
}

func main() {
	ch := make(chan int, 100)
	exitChan := make(chan bool, 1)

	go producer(ch)
	go consumer(ch, exitChan)

	// 协程执行，会随着 main() 结束而结束
	// 解决：新增一个exitChan通道，如果exitChan通道写入true退出main
	for {
		if <-exitChan {
			return
		}
	}

	fmt.Println("end main")
}
